//
//  HMTextView+Extension.swift
//  Weibo
//
//  Created by itteacher on 2017/8/3.
//  Copyright © 2017年 itteacher. All rights reserved.
//

import UIKit

extension HMTextView {
    
    //  获取富文本对应的字符串
    var emotionText: String {
        var result = ""
        //  获取文本框的富文本，在指定范围遍历富文本获取图片表情的表情描述
        self.attributedText.enumerateAttributes(in: NSMakeRange(0, self.attributedText.length), options: []) { (info, range, _) in
            //  info : 富文本信息
            //  range: 富文本对应的范围
            print(info)
            print(NSStringFromRange(range))
            if let attachMent = info["NSAttachment"] as? HMTextAttachment {
                //  有文本附件表示图片表情富文本
                let chs = attachMent.emoticon!.chs
                result += chs!
            } else {
                //  普通文字富文本
                //  根据范围截取富文本，获取富文本对应的字符串
                let text = self.attributedText.attributedSubstring(from: range).string
                result += text
            }
            
            
        }
        return  result
    }
    
    
    //  插入表情富文本或者emoji表情
    func insertEmoticon(emoticon: HMEmoticon) {
        if emoticon.type == "0" {
            //  图片表情
            //  图片转成富文本
            //  记录上一次textView的里面富文本
            let lastAttributedStr = NSMutableAttributedString(attributedString: self.attributedText)
//            //  1. 创建图片对象
//            let image = UIImage(named: emoticon.path!, in: HMEmoticonTools.sharedTools.emoticonBundle, compatibleWith: nil)
//            //  2. 创建文本附件
//            let textAttachment = HMTextAttachment()
//            //  关联文本附件对应的表情模型
//            textAttachment.emoticon = emoticon
//            //  设置文本附件所需要的图片
//            textAttachment.image = image
//            //  获取文字的行高
//            let lineHeight = self.font!.lineHeight
//            //  设置文本附件的bounds， 设置bunds会影响子控件的显示位置
//            textAttachment.bounds = CGRect(x: 0, y: -4, width: lineHeight, height: lineHeight)
//            //  3. 根据文本附件创建富文本
//            let attrbutedStr = NSAttributedString(attachment: textAttachment)
            let attrbutedStr = NSAttributedString.attributedStringWith(emoticon: emoticon, font: self.font!)
            //  拼接富文本
            //            lastAttributedStr.append(attrbutedStr)
            //  获取选中范围
            var selectRange = self.selectedRange
            //  根据选中范围替换表情富文本
            lastAttributedStr.replaceCharacters(in: selectRange, with: attrbutedStr)
            
            //  统一设置富文本字体大小
            lastAttributedStr.addAttribute(NSFontAttributeName, value: self.font!, range: NSMakeRange(0, lastAttributedStr.length))
            //  4. 设置富文本
            self.attributedText = lastAttributedStr
            //  设置光标位置在表情后面显示
            selectRange.location += 1
            //  设置选中范围的长度为0
            selectRange.length = 0
            //  设置光标
            self.selectedRange = selectRange
            
            //  设置富文本的的时候系统不会主动调用文字改变的通知和文字改变的代理方法
            //  自己发送文字改变的通知
            NotificationCenter.default.post(name: NSNotification.Name.UITextViewTextDidChange, object: nil)
            //  自己通过代理对象调用文字改变的代理方法
            //  ？ 判断代理方法是否实现，如果实现了那么直接执行，否则返回nil
            self.delegate?.textViewDidChange?(self)
            
        } else {
            //  emoji表情
            let emoji = (emoticon.code! as NSString).emoji()
            //  把内容插入到光标位置后面
            self.insertText(emoji!)
        }
    }
}
